package com.jdk._04_并行流与串行流_工作窃取模式;

import java.util.stream.LongStream;

/**
 * 串行流，为单线程执行
 * <p>
 * 并行流，工作时会将任务，拆分为多个子任务，最终汇总数据得到结果
 * 启动多线程数大致为（CPU核数-1）
 * <p>
 * 工作窃取模式 Fork/Join
 * 并行流采取的是工作窃取模式，线程自身任务执行完毕后，会去其他线程队列中获取最后一个任务，放进自己的队列里执行
 * 如果碰到需要等待的情况，不会进行等待，而是直接去执行其他子任务
 */
public class _Test {

    public static void main(String[] args) {

        /**
         * 测试累加
         * 串行流需要耗时 30s
         */
        long l1 = System.currentTimeMillis();
        long reduce = LongStream.rangeClosed(0, 100000000000L)
                .sequential()
                .reduce(0, Long::sum);
        long l2 = System.currentTimeMillis();
        System.out.println("串行流耗时：" + (l2 - l1) / 1000 + "s");//30s

        /**
         * 测试累加
         * 并行流流需要耗时 8s
         */
        long l3 = System.currentTimeMillis();
        long reduce1 = LongStream.rangeClosed(0, 100000000000L)
                .parallel()
                .reduce(0, Long::sum);
        long l4 = System.currentTimeMillis();
        System.out.println("并行流耗时：" + (l4 - l3) / 1000 + "s");//8s

    }

}
